/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Utilidades;

import java.util.Stack;

/**
 *
 * @author Administrador
 */
public class Balance {

    /**
     * Verifica si la cadena tiene igual cantidad de caracteres de inicio como de fin
     * @param str Cadena del tag sin palabras reservadas
     * @param chIni Caracter de inicio a buscar para ver si está balanceada
     * @param chFin Caracter de fin a buscar para ver si está balanceada
     * @return booleano diciendo si es balanceada o no.
     */
    public static boolean esBalanceada(String str, char chIni, char chFin) {
        boolean resultado;

        if (chIni == chFin) {
            resultado = esIgualmenteBalanceada(str, chIni);
        }
        else {
            resultado = noEsIgulamenteBalanceada(str, chIni, chFin);
        }
        return resultado;
    }

    /**
     * Metodo invocado para determinar si el caracter esta presente una cantidad par de veces, osea està balanceado
     * @param str Cadena a analizar
     * @param c0 Caracter a buscar para saber si está balanceada o no
     * @return boolenao que determina si el string está balanceado
     */
    private static boolean esIgualmenteBalanceada(final String str, final char c0) {
        char[] array = str.toCharArray();
        int count = 0;

        for (int i = 0; i < array.length; i++) {
            char c = array[i];
            if (c == c0) {
                count++;
            }
        }

        int proc = (count / 2) * 2;
        return (count == proc);
    }

    /**
     * Metodo invocado para determinar si los caracteres de apertura y cierre existen una misma cantidad de veces, por lo que la pila queda vacia
     * @param str Cadena a analizar
     * @param c0 Caracter de apertura
     * @param c1 Caracter de cierre
     * @return boolenao que determina si los caracteres estan balanceados
     */
    private static boolean noEsIgulamenteBalanceada(final String str, final char c0, final char c1) {
        char[] array = str.toCharArray();
        Stack<String> pila = new Stack<String>();

        for (int i = 0; i < array.length; i++) {
            char ch = array[i];
            if (ch == c0) {
                pila.add(String.valueOf(ch));
            }
            else if (ch == c1) {
                if (pila.isEmpty() == false && pila.peek().charAt(0) == c0) {
                    pila.pop();
                }
                else {
                    pila.push(String.valueOf(ch));
                }
            }
        }
        return pila.isEmpty();
    }
}
